﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MarchEstate.Manager.BusinesEntity.Costcalculate;

namespace MarchEstate.Manager.ObjectModel.Costcalculate
{
    public class ResRateTime : AbstractResRateTime
    {
        public override decimal GetItemFee(out List<object[]> segvalue)
        {
            decimal fee = 0;
            segvalue = new List<object[]>();
            List<object[]> dayvalue = new List<object[]>();
            //获取按月划分的段并循环计算每段的费用
            List<DateTime[]> listdate = DateHelper.GetDateSegment(LastDate, CurrentDate);
            for (int i = 0; i < listdate.Count; i++)
            {
                //获取本段时间的天数 因为不同的月份天数不一样，比如：5月有31天 4月则只有30天  还有闰年2月只有28天
                int days = DateHelper.GetDays(listdate[i][1], listdate[i][0].AddDays(1));
                //所有段的时间除了最后一段有可能不是完整的一个月，其他段都是一月的长度
                //所以计算费用的方式与最后一段不一样
                if (i != listdate.Count - 1 || listdate[i][1].Day == listdate[i][0].Day)
                {
                    //计算月单价*面积 得到一个月的费用
                    decimal seg = Convert.ToDecimal((Unitprice * Usearea).ToString("0.00"));
                    
                    fee += seg;
                    //计算每天的费用 一个月的费用除以天数
                    decimal dayfee = Convert.ToDecimal((Unitprice * Usearea / days).ToString("0.00"));
                    //这里需要对开始日期增加一天，比如：段的时间是2012-4-12 2012-5-12
                    //那费用应该是从2012-4-13 才产生 一直到2012-5-12 共31天 
                    //所以不同月段每天的费用可能不一样
                    DateTime daytime = listdate[i][0].AddDays(1);//
                    dayvalue.Clear();
                    for (int j = 0; j < days; j++)
                    {
                        //同一月段每天的费用可能也不一样，因为月段总费用除以天数肯定除不尽，
                        //所以有可能月段每天的费用相加会不等于月段总费用
                        //所以月段里最后一天的费用计算方式与其他天的计算方式不一样，是拿总费用减去前面天数的相加费用后得到最后一天的费用
                        if (j != days-1)
                        {
                            dayvalue.Add(new object[] { daytime, dayfee });
                            daytime = daytime.AddDays(1);
                        }
                        else
                        {
                            //总费用减去前面天数的相加费用后得到最后一天的费用
                            dayvalue.Add(new object[] { daytime, (seg-dayfee * (days - 1)) });
                        }
                    }

                    segvalue.Add(new object[] { listdate[i][0], listdate[i][1], seg, dayvalue });
                }
                else
                {
                    //最后一段费用的计算就按默认30 得到每天的费用  再乘以天数可得
                    decimal dayfee = Convert.ToDecimal((Unitprice * Usearea / 30).ToString("0.00"));
                    decimal seg = dayfee * days;
                    
                    fee += seg;
                    DateTime daytime = listdate[i][0].AddDays(1);
                    dayvalue.Clear();
                    for (int j = 0; j < days; j++)
                    {
                        dayvalue.Add(new object[] { daytime, dayfee });
                        daytime = daytime.AddDays(1);
                    }

                    segvalue.Add(new object[] { listdate[i][0], listdate[i][1], seg, dayvalue });
                }
                //List<DateTime[]> listday = DateHelper.GetDaySegment(listdate[i][0], listdate[i][1]);
                //for (int j = 0; j < listday.Count; j++)
                //{
                //    decimal monthprice = Convert.ToDecimal((Unitprice * Usearea / DateHelper.GetMonthDayNum(listday[j][0].Year, listday[j][0].Month)).ToString("0.00"));
                //    int days = DateHelper.GetDays(listday[j][1], listday[j][0]);
                //    fee += monthprice * days;
                //}

                //fee = Convert.ToDecimal(fee.ToString("0.00"));
            }

            return fee;
        }

        public override decimal GetLateFee()
        {
            //滞纳金除了要算出当月的，还要根据拖欠时间长短重新计算以前的滞纳金
            //计算滞纳金还需要陈欠月数
            //
            return 0;
        }
    }
}
